/**
 * http.js
 * 封装axios，
 * 调用方法:
 * http.get('/api/enquiry/web/query',{id:1}).then((res)=>{你的操作})
 * http.post('/api/enquiry/web/update',{id:1}).then((res)=>{你的操作})
 * http.postFormData('/api/enquiry/web/update',{id:1,file:file}).then((res)=>{你的操作})
 */
import axios from 'axios'
import router from '../router'
import store from '../store'

const BASE_URL = process.env.VUE_APP_URL;

/**
 * 添加响应拦截器，统一处理服务器响应和异常
 */
axios.interceptors.response.use(
    response => {
        return response
    },
    error => {
        /**
         * 状态码401代表无权限访问，权限失效，需要重新获取authToken
         * 状态码500代表REST服务器异常
         */
        const status = error.response.status
        const message = error.response.data.message
        if (status === 401) {
            store.dispatch('userLogout'); // 可能是token过期，清除它
            router.replace({ //跳转到登录页面
                path: 'login',
                query: { redirect: router.currentRoute.fullPath } // 将跳转的路由path作为参数，登录成功后跳转到该路由
            });
        }

        /**
         * 1.处理系统服务异常
         * 2.处理SoaException异常
         */
        if (status === 500) {
            if (message.indexOf('ERROR_CODE_003') > -1) {
                this.$message.error('服务器错误!!')
                return
            }

            this.$message.error(message)
        }

        return Promise.reject(error)
    }
)

axios.interceptors.request.use(
    config => {
        if (store.state.JWT_TOKEN) {  // 判断是否存在token，如果存在的话，则每个http header都加上token
            config.headers.Authorization = `Bear ${localStorage.JWT_TOKEN}`;
        }
        return config;
    },
    err => {
        return Promise.reject(err);
    }
);

export default {
    /**
     * get方法，对应get请求
     * @param {String} url [请求的url地址]
     * @param {Object} params [请求时携带的参数]
     */
    get (url, params) {
        return new Promise((resolve, reject) => {
            axios.get(BASE_URL + url, {
                params: params
            }).then(res => {
                resolve(res.data)
            }).catch(err => {
                reject(err)
            })
        })
    },

    /**
     * post方法，对应post请求
     * @param {String} url [请求的url地址]
     * @param {Object} params [请求时携带的参数]
     */
    post (url, params) {
        return new Promise((resolve, reject) => {
            axios.post(BASE_URL + url, params)
                .then(res => {
                    resolve(res.data)
                })
                .catch(err => {
                    reject(err)
                })
        })
    },

    /**
     * postFormData方法，对应post请求，用来提交文件+数据
     * @param {String} url [请求的url地址]
     * @param {Object} params [请求时携带的参数]
     */
    postFormData (url, params) {
        const URL = BASE_URL + url;
        return new Promise((resolve, reject) => {
            axios({
                headers: {
                    'Content-Type': 'multipart/form-data'
                },
                transformRequest: [function (data) { // 在请求之前对data传参进行格式转换
                    const formData = new FormData()
                    Object.keys(data).forEach(key => {
                        formData.append(key, data[key])
                    })
                    return formData
                }],
                URL,
                method: 'post',
                data: params
            }).then(res => {
                resolve(res.data)
            }).catch(err => {
                reject(err)
            })
        })
    }
}
